<?php

/**
 * laravel model 类 非静态方法使用静态方法调用的原理
 *   model::select()
 *  1.  __callStatic() model::select() 静态方法select()不存在  new 对象$model  调用$model->select()
 *  2.$model->select()  select() 方法不存在__调用 __call() __call()在调用查询类Query的select()方法
 * 
 *  以静态方式调用非静态方法会报错  Uncaught Error: Non-static method Model::query()
 * 
 * query() 是静态方法,但是静态方法 不允许使用$this 调用自己的方法 只能使用先实例化自己(new static)

 */
class Model
{
    /**
     * 调用不存在的静态方法
     * 先实例化对象 调用不存在的方法
     */
    public static function __callStatic($method, $parameters)
    {
        echo "static forward\n";
        //return (new static)->$method(...$parameters);
        //调用非静态方法
        return call_user_func_array([new static(), $method], $parameters);
    }

    public function __call($method, $parameters)
    {
        echo "non-static forward\n";
        return $this->newQuery()->$method(...$parameters);
    }

    public static function query()
    {
        return (new static)->newQuery();
    
    }

    public  function newQuery()
    {
        return new Query($this);
    }
}

class Query
{
    protected $model;

    public function __construct($model)
    {
        $this->model = $model;
    }



    public function select()
    {
        echo "select\n";
    }
}

//Model::select();
Model::query()->select();
